#include <iostream>
#include <string.h>
#include <algorithm>
using namespace std;
#define INF 0x3f3f3f3f

typedef long long LL;

const LL N = 510;

LL dis[N][N];

struct Node
{
    LL id;
    bool sex;
    LL val;
} nodes[N];

bool mycmp(const Node &n1, const Node &n2)
{
    if (n1.val != n2.val)
    {
        return n1.val < n2.val;
    }
    return n1.id < n2.id;
}

int main()
{
    memset(dis, INF, sizeof(dis));
    LL n;
    cin >> n;
    for (LL i = 1; i <= n; i++)
    {
        char c;
        cin >> c;
        nodes[i].id = i;
        nodes[i].sex = c == 'M';
        LL t, val, cnt;
        cin >> cnt;
        while (cnt--)
        {
            cin >> t >> c >> val;
            dis[i][t] = val;
        }
    }
    for (LL i = 1; i <= n; i++)
    {
        dis[i][i] = 0;
    }
    for (LL k = 1; k <= n; k++)
    {
        for (LL i = 1; i <= n; i++)
        {
            for (LL j = 1; j <= n; j++)
            {
                dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
            }
        }
    }
    for (LL i = 1; i <= n; i++)
    {
        LL maxd = 0;
        for (LL j = 1; j <= n; j++)
        {
            if (dis[j][i] != INF && (nodes[i].sex != nodes[j].sex))
            {
                maxd = max(maxd, dis[j][i]);
            }
        }
        nodes[i].val = maxd;
    }
    sort(nodes + 1, nodes + n + 1, mycmp);
    LL p = 1;
    while (nodes[p].sex)
    {
        p++;
    }
    cout << nodes[p].id;
    LL pos = p + 1;
    while (nodes[p].val == nodes[pos].val)
    {
        if (!nodes[pos].sex)
        {
            cout << " " << nodes[pos].id;
        }
        pos++;
    }
    cout << endl;
    p = 1;
    while (!nodes[p].sex)
    {
        p++;
    }
    pos = p + 1;
    cout << nodes[p].id;
    while (nodes[p].val == nodes[pos].val)
    {
        if (nodes[pos].sex)
        {
            cout << " " << nodes[pos].id;
        }
        pos++;
    }
    return 0;
}

// #include <iostream>
// #include <string.h>
// #include <algorithm>
// #include <cstdlib>
// using namespace std;
// #define ERROR 1e-5

// const int N = 510;
// int n, ep;
// int dis[N], ans[N];
// bool vis[N];

// struct EDGE
// {
//     int f, t, val;
//     EDGE *next;
// } edges[N * N];

// struct NODE
// {
//     int id;
//     int sex;
//     double yxy;
//     EDGE *first;
// } nodes[N];

// void addedge(int f, int t, int val)
// {
//     edges[ep].f = f;
//     edges[ep].t = t;
//     edges[ep].val = val;
//     edges[ep].next = nodes[f].first;
//     nodes[f].first = &edges[ep];
//     ep++;
// }

// void dijstra(int start)
// {
//     memset(dis, 0x3f3f3f3f, sizeof(dis));
//     memset(vis, false, sizeof(vis));
//     dis[start] = 0;
//     while (1)
//     {
//         int pos = -1, mind = 0x3f3f3f3f;
//         for (int i = 1; i <= n; i++)
//         {
//             if (!vis[i] && mind > dis[i])
//             {
//                 pos = i;
//                 mind = dis[i];
//             }
//         }
//         if (pos == -1)
//         {
//             break;
//         }
//         vis[pos] = true;
//         EDGE *e = nodes[pos].first;
//         while (e != NULL)
//         {
//             if (dis[e->t] > dis[e->f] + e->val)
//             {
//                 dis[e->t] = dis[e->f] + e->val;
//             }
//             e = e->next;
//         }
//     }
//     for (int i = 1; i <= n; i++)
//     {
//         if (dis[i] != 0x3f3f3f3f && (nodes[start].sex ^ nodes[i].sex))
//         {
//             ans[i] = max(ans[i], dis[i]);
//         }
//     }
// }

// bool mycmp(const NODE &n1, const NODE &n2)
// {
//     if (abs(n1.yxy - n2.yxy) > ERROR)
//     {
//         return n1.yxy > n2.yxy;
//     }
//     return n1.sex < n2.sex;
// }

// int main()
// {
//     char c;
//     cin >> n;
//     for (int i = 1; i <= n; i++)
//     {
//         nodes[i].id = i;
//         cin >> c;
//         nodes[i].sex = c == 'M';
//         int cnt;
//         cin >> cnt;
//         while (cnt--)
//         {
//             int t, val;
//             cin >> t >> c >> val;
//             addedge(i, t, val);
//         }
//     }
//     for (int i = 1; i <= n; i++)
//     {
//         dijstra(i);
//     }
//     for (int i = 1; i <= n; i++)
//     {
//         nodes[i].yxy = 1.0 / ans[i];
//     }
//     sort(nodes + 1, nodes + n + 1, mycmp);
//     cout << nodes[1].id;
//     int pos = 1;
//     while ((nodes[pos].sex == nodes[pos + 1].sex) && (nodes[pos].yxy - nodes[pos + 1].yxy < ERROR))
//     {
//         cout << " " << nodes[pos + 1].id;
//         pos++;
//     }
//     cout << endl;
//     pos = 1;
//     while (!nodes[pos].sex)
//     {
//         pos++;
//     }
//     cout << nodes[pos].id;
//     while ((nodes[pos].sex == nodes[pos + 1].sex) && (nodes[pos].yxy - nodes[pos + 1].yxy < ERROR))
//     {
//         cout << " " << nodes[pos + 1].id;
//         pos++;
//     }
//     return 0;
// }